<?php

require_once(SERVER_ROOT . '/utils/' . 'MYSQLAdapter.php');
require_once(SERVER_ROOT . '/daos/' . 'TipoUsuarioDAO.php');
require_once(SERVER_ROOT . '/daos/' . 'EscritorioDAO.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/fatec-si/controllers/'. 'email.php');

class UsuarioDAO {

	private $_STATUS_ATIVO = 1;
	private $_STATUS_INATIVO = 0;
	private $_SUCESSO = 1;
	private $_USUARIO_INVALIDO = 2;
	private $_CODIGO_INVALIDO = 3;
	private $_ERRO = 0;
	private $adapter;
	private $tipoUsuarioDAO;
	private $escritorioDAO;

	public function __construct() {
		$this->adapter = new MYSQLAdapter($GLOBALS['config']);
		$this->tipoUsuarioDAO = new TipoUsuarioDAO();
		$this->escritorioDAO = new EscritorioDAO();
	}

	public function save(array $user) {
		if (!$this->isValidUser($user)) {
			return $this->_USUARIO_INVALIDO;
		}
		if ($user['tipo_usuario'] == 'gerente') {
			return $this->saveGerente($user);
		} else {
			if (!$this->isValidCodes($user['cod_gerente'], $user['cod_escritorio'])) {
				return $this->_CODIGO_INVALIDO;
			}
			$id_escritorio = $this->getIdEscritorioByCode($user['cod_escritorio']);
			$id_tipo_usuario = $this->getIdTipoUsuarioByName($user['tipo_usuario']);

			if ($id_tipo_usuario == null) {
				return $this->_ERRO;
			}
			$hash_senha = $this->adapter->geraMD5($user['senha']);
			$data = array(
					'id_escritorio' => $id_escritorio, 'id_tipo_usuario' => $id_tipo_usuario, 'login' => $user['login'], 'senha' => $hash_senha, 'nome' => $user['nome'], 'telefone_fixo' => $user['telefone_fixo'], 'telefone_movel' => $user['telefone_movel'], 'email' => $user['email'], 'data_nascimento' => $user['data_nascimento'], 'cep' => $user['cep'], 'endereco' => $user['endereco'], 'cidade' => $user['cidade'], 'estado' => $user['estado'], 'rg' => $user['rg'], 'cpf' => $user['cpf'], 'status' => $user['status']);
			$id_usuario = $this->adapter->insert("tb_usuario", $data);
			if ($id_usuario) {
				if ($user['tipo_usuario'] == 'advogado' && !empty($user['numero_oab'])) {
					$data = array('id_advogado' => $id_usuario, 'numero_oab' => $user['numero_oab']);
					$id_oab = $this->adapter->insert("tb_oab", $data);
				}
				return $this->_SUCESSO;
			} else {
				return $this->_ERRO;
			}
		}
	}

	public function saveGerente(array $user) {
		//TODO: Melhorar isso id provisorio ?
		$id_escritorio = 0;
		$id_tipo_usuario = $this->getIdTipoUsuarioByName($user['tipo_usuario']);

		$hash_senha = $this->adapter->geraMD5($user['senha']);
		$data = array(
				'id_escritorio' => $id_escritorio, 'id_tipo_usuario' => $id_tipo_usuario, 'login' => $user['login'], 'senha' => $hash_senha, 'nome' => $user['nome'], 'telefone_fixo' => $user['telefone_fixo'], 'telefone_movel' => $user['telefone_movel'], 'email' => $user['email'], 'data_nascimento' => $user['data_nascimento'], 'cep' => $user['cep'], 'endereco' => $user['endereco'], 'cidade' => $user['cidade'], 'estado' => $user['estado'], 'rg' => $user['rg'], 'cpf' => $user['cpf'], 'status' => $user['status']);

		$id_usuario = $this->adapter->insert("tb_usuario", $data);
		if ($id_usuario) {
			$cod_escritorio = $this->generationCodeEscritorio();
			$cod_gerente = $this->generationCodeGerente();
			$data_escritorio = array('cod_escritorio' => $cod_escritorio, 'id_gerente' => $id_usuario, 'cod_gerente' => $cod_gerente);
			$id_escr = $this->adapter->insert("tb_escritorio", $data_escritorio);
			if ($id_escr) {
				$data_update = array('id_escritorio' => $id_escr);
				$this->adapter->update("tb_usuario", $data_update, "id_usuario = '$id_usuario'");
				return $this->_SUCESSO;
			} else {
				//rollback
				$this->adapter->delete("tb_usuario", "id_usuario = '$id_usuario'");
				return $this->_ERRO;
			}
		} else {
			return $this->_ERRO;
		}
	}

	public function generationCodeEscritorio() {
		$row = $this->escritorioDAO->findMaxCodeEscritorio();
		if ($row['cod_escritorio']) {
			return $row['cod_escritorio'] + 1;
		} else {
			return 1000;
		}
	}

	public function generationCodeGerente() {
		$row = $this->escritorioDAO->findMaxCodeGerente();
		if ($row['cod_gerente']) {
			return $row['cod_gerente'] + 1;
		} else {
			return 500;
		}
	}

	public function isValidUser(array $user) {
		$login = $user['login'];
		$this->adapter->select("tb_usuario", "login = '$login'");
		$row = $this->adapter->fetch();
		if ($row) {
			return false;
		} else {
			return true;
		}
	}

	public function isValidCodes($cod_gerente, $cod_escritorio) {
		$row = $this->escritorioDAO->findEscritorioByCodes($cod_gerente, $cod_escritorio);
		if ($row['cod_gerente'] == $cod_gerente && $row['cod_escritorio'] == $cod_escritorio) {
			return true;
		} else {
			return false;
		}
	}

	public function getIdEscritorioByCode($code) {
		$row = $this->escritorioDAO->findEscritorioByCode($code);
		if ($row['cod_escritorio'] == $code) {
			return $row['id_escritorio'];
		}
	}

	public function getIdTipoUsuarioByName($name) {
		$row = $this->tipoUsuarioDAO->findByName($name);
		if ($row['tipo_usuario_nome'] == $name) {
			return $row['id_tipo_usuario'];
		}
	}

	public function findAllStatusPendency() {
		$this->adapter->select("tb_usuario", "status = 0");
		$row = $this->adapter->fetchAll('User');
		return $row;
	}

	public function findStatusPendencyByUserType($tipo) {
		$row = $this->tipoUsuarioDAO->findByName($tipo);
		$id_tipo_usuario = $row['id_tipo_usuario'];
		$this->adapter->select("tb_usuario", "status = 0 AND id_tipo_usuario = '$id_tipo_usuario'");
		$row = $this->adapter->fetchAll('User');
		return $row;
	}

	public function activateUserById($id_usuario) {
		$data_update = array('status' => $this->_STATUS_ATIVO);
		$user = $this->findById($id_usuario);
		$email =  new EmailController();
		$result = $email->send(array("to" => $user['email'] , "message" => "Seu registro foi ativado!"));			
		$this->adapter->update("tb_usuario", $data_update, "id_usuario = '$id_usuario'");
		
	}

	public function inactivateUserById($id_usuario) {
		$data_update = array('status' => $this->_STATUS_INATIVO);
		$user = $this->findById($id_usuario);
		$email =  new EmailController();
		$email->send(array("to" =>  $user['email'] , "message" => "Seu registro foi inativado!"));
		$this->adapter->update("tb_usuario", $data_update, "id_usuario = '$id_usuario'");
	}
	
	

	public function countByType($type) {
		$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario and tipo_usuario_nome = '$type'");
		return $this->adapter->getAffectedRows();
	}

	public function count() {
		$this->adapter->select("tb_usuario");
		return $this->adapter->getAffectedRows();
	}
	public function countByTypeAndInactivate($type) {
		$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario and tipo_usuario_nome = '$type' AND status = 0");
		return $this->adapter->getAffectedRows();
	}


	public function countByOffice($type, $id_escritorio) {
		$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario and tipo_usuario_nome = '$type' and tb_usuario.id_escritorio = $id_escritorio");
		return $this->adapter->getAffectedRows();
	}

	public function findById($id) {
		$this->adapter->select("tb_usuario", "id_usuario = '$id'");
		return $this->adapter->fetch();
	}
	public function countAllByTypeAndEscritorio($type,$id_escritorio) {
		$tipo_usuario = $this->tipoUsuarioDAO->findByName($type);
		$id_tipo_usuario = $tipo_usuario['id_tipo_usuario'];
		$this->adapter->select("tb_usuario", "id_escritorio = '$id_escritorio' AND id_tipo_usuario = '$id_tipo_usuario'");
		return $this->adapter->getAffectedRows();
	}

	public function removeById($id) {
		return $this->adapter->delete("tb_usuario", "id_usuario = '$id' ");
	}

	public function update(array $user) {
		$id = $user['id_usuario'];
		$data = array('senha' => $user['senha'], 'nome' => $user['nome'], 'telefone_fixo' => $user['telefone_fixo'], 'telefone_movel' => $user['telefone_movel'], 'email' => $user['email'], 'cep' => $user['cep'], 'endereco' => $user['endereco'], 'cidade' => $user['cidade'], 'data_nascimento' => $user['data_nascimento'], 'estado' => $user['estado'], 'rg' => $user['rg'], 'cpf' => $user['cpf']);
		return $this->adapter->update("tb_usuario", $data, "id_usuario = '$id'");
	}

	public function findAllByType($type, $sidx, $sord, $start, $limit) {
		$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario
				and tipo_usuario_nome = '$type'
				ORDER BY $sidx $sord LIMIT $start, $limit");
		return $this->adapter->fetchAllByFilter('User', array('senha', 'login'));
	}

	public function findAllByTypeWithFilters($type, $sidx, $sord, $start, $limit, $search_field, $search_string, $search_oper) {
		if ($search_oper == 'eq') {
			$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario
					and tipo_usuario_nome = '$type' and $search_field = '$search_string'
					ORDER BY $sidx $sord LIMIT $start, $limit");
		} else {
			$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario
					and tipo_usuario_nome = '$type' and $search_field like '%$search_string%'
					ORDER BY $sidx $sord LIMIT $start, $limit");
		}
		return $this->adapter->fetchAllByFilter('User', array('senha', 'login'));
	}

	public function findAllByOffice($type, $sidx, $sord, $start, $limit, $id_escritorio) {
		$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_escritorio = '$id_escritorio' AND tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario
				and tipo_usuario_nome = '$type'
				ORDER BY $sidx $sord LIMIT $start, $limit");
		return $this->adapter->fetchAllByFilter('User', array('senha', 'login'));
	}

	public function findAllByOfficeWithFilters($type, $sidx, $sord, $start, $limit, $id_escritorio, $search_field, $search_string, $search_oper) {
		if ($search_oper == 'eq') {
			$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_escritorio = '$id_escritorio' AND tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario
					and tipo_usuario_nome = '$type' and $search_field = '$search_string'
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('User', array('senha', 'login'));
		} else {
			$this->adapter->select("tb_usuario,tb_tipo_usuario", "tb_usuario.id_escritorio = '$id_escritorio' AND tb_usuario.id_tipo_usuario = tb_tipo_usuario.id_tipo_usuario
					and tipo_usuario_nome = '$type' and $search_field like '%$search_string%'
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('User', array('senha', 'login'));
		}
	}

}
